iT邦幫忙

2

PHP 自學筆記 (2)

  • 分享至 

  • xImage
  •  

今天學的東西,需要有OOP的觀念,也就是物件導向的觀念,由於之前自己學過JS後,以為物件都是可以直接創建。但事實並非如此,而是需要搭配class(類)來創建我們的物件。

class好比設計藍圖,而我們可以利用這個藍圖,去創建物件。如class Car => 創建 obj Audi、obj Toyota、一些method...

class命名不可為數字開頭,大小寫沒有分,所以不能在宣告一個class dog。

而此處我們宣告變數,型態有public為開放,內外都可呼叫,如果沒有特別加,預設就是publicprivate為私有(一般會在前面加上底線),只能在當前類的內部呼叫,而其實還有一個叫做protected受保護,跟private一樣只能在類的內部呼叫、取用,而之後會操作並詳解。而通常不會在class宣告變數的地方賦予初始值,除非所有實體化的物件需要某個屬性是統一的值,大多都是使用private或protected來增加對屬性的控制性,一般都是透過方法來實現對屬性的修改。


class Dog 
{
    private $_breed;
    private $_age;
    private $_gender;
}

建構式(__construct() ),也就是在new完物件後,會執行一次,也就是初始化的概念。
此處我們利用建構式,獲取物件所傳來的參數,並賦予給我們宣告好的變數。


    public function  __construct($objBreed, $objAge, $objGender)
    {
        // 利用$this可以指向obj本體
        $this->_breed = $objBreed;
        $this->_age = $objAge;
        $this->_gender = $objGender;
        $this->display();
    }

而我們在class外面,利用new去創建一個實體化物件。

// $bogi = new Dog;
// 如果在建構式需要傳入參數,就須加入()。
$bogi = new Dog("doge", 20, "male");
var_dump($bogi);
// object(Dog)#1 (3) { ["_breed":"Dog":private]=> string(4) "doge" ["_age":"Dog":private]=> int(20) ["_gender":"Dog":private]=> string(6) "female" }
// 這個Dog物件有3個屬性 ["對應屬性名及詳情"] => 屬性值的類型(長度) "屬性值

而後我們在class內寫了一些方法,display在初始化的時候,用來呼叫我們的方法及一些數據等等。
在class外要指向對應屬性需要,$物件名->屬性名如:$bogi-> _ breed(如果為變數為private則無法從外面指向),而在class內僅需$this即可指向如:$this-> _ breed 。

    public function display()
    {
        // return $age; //這樣寫$age只是純變數,與我們所設置的public $age(物件中的屬性)無相關

        // 利用$this可以指向obj本體($bogi),藉此來指向物件下的屬性
        // return $this->_gender;

        echo $this->sleep();
        echo  "<br/>";
        echo $this->showBreed();
        echo  "<br/>";
        echo $this->showAge();
        echo  "<br/>";
        echo $this->showGender();
        echo  "<br/>";
        $this->changeGender('female');
        echo $this->showGender();
        echo "<hr/>";
        $this->removeAge();
    }
    public function showBreed()
    {
        echo $this->_breed;
    }
    public function showAge()
    {
        echo $this->_age;
    }
    public function showGender()
    {
        echo $this->_gender;
    }

我們可以在函數中去更改屬性值,觀察刪除後的物件,我們在此處在創建一個物件bogi2去做比較,可發現age已被刪除,很少用到刪除及新增,大多使用修改讀取居多。


    // 更改性別
    private function changeGender($gender)
    {
        // 修改屬性
        $this->_gender = $gender;
    }
    // 刪除年齡
    private function removeAge()
    {
        // 刪除屬性
        unset($this->_age);
    }

   $bogi2 = new Dog("shiba", "87", "female");
   var_dump($bogi2);
   echo "<hr>";

https://ithelp.ithome.com.tw/upload/images/20200616/20126182e3fRKA7Bb4.png

CLASS 可以獲取類別名稱,而通常以const來設置常數,與js相同,但如果我們想獲取常數的話,無法用一般的方法進行獲取($jojo->PI),因為它會去物件下找為$PI的常數,但我們並沒有,之後會講解如何獲取常數的部分。

class Human
{
    public function display()
    {
        echo  __CLASS__;
    }
    // 設置常數
    const PI = 3.14;
}
$jojo = new Human();
// 想要讀取常數的話,這樣會獲取不到,因為它會去找為$PI的常數,但我們並沒有。
$jojo->PI;
$jojo->display(); //Human

https://ithelp.ithome.com.tw/upload/images/20200616/20126182w80Z0MrsDJ.png

而這是在網上抓的一個基本php執行的流程。
https://ithelp.ithome.com.tw/upload/images/20200617/20126182jNqeO7q7gU.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言